import axios from 'axios'

import store from '@/store'

import router from '@/router'
// 创建axios实例 - 返回一个实例 - 本质还是axios，这样的好处
// 可以根据不同的需求，封装不同的请求 - 灵活
const ajax = axios.create({
    baseURL: 'http://toutiao.itheima.net' // 统一 配置 基地址
})

// 添加请求拦截器
ajax.interceptors.request.use(config => {

    // 对 token 做统一处理，如果vuex中有token，则在请求头中 通过 Authorization字段 携带 给 后台

    if (store.state.token) {
        config.headers.Authorization = `Bearer ${store.state.token}`
    }

    // console.log(config)
    return config
}, error => {
    return Promise.reject(error)
})



// 添加响应拦截器 可以对返回的数据 或者 错误 (token过期) 做统一处理
ajax.interceptors.response.use(resp => { // http状态码以 2xx 或 3xx开头，执行成功的回调 
    // console.log(resp);
    // resp.data 直接返回组件，目的是 让组件 拿到数据 之后 少写一层 .data
    return resp.data
}, error => { // // http状态码以 4xx 或 5xx开头，执行失败的回调

    // 401 就是一个 典型的失败 表示 token 过期 或者 无效
    // token过期的解决办法：两种
    // 1. 重新登录
    // 2. token续签 (配合refresh_token解决)

    if (error.response.status === 401) {

        // console.log(router);

        // 1. 清空 vuex中 的token
        store.commit('setToken', '')
            // 2. 跳转到登录页面重新登录            replace 跟 path 同理
        router.replace({

            path: '/login?from=' + router.currentRoute.path
        })
    }
    return Promise.reject(error)
})


// 导出 请求函数
export default ajax